﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpCommonEdit.h"


namespace gcmp
{
    class IUiView;
    class Vector3d;


    /// \brief 复制操作的Behavior，方便定制复制Action的行为。
    class GCMP_COMMON_EDIT_EXPORT IActionCopyBehavior
    {
    public:
        /// \brief 复制辅助线状态枚举值
        ///
        /// 当前只关注辅助线的状态
        enum class  CopyActionStatus: int32_t
        {
            NotStart = 0,
            GettingStartPoint,  ///<获取起始点
            GettingEndPoint     ///<获取终点
        };

    public:
        /// \brief 析构函数
        virtual ~IActionCopyBehavior(){}

        /// \brief 根据传入的当前状态获取描述信息
        ///
        /// \param  copyStatus 期望获取对应描述信息的状态
        /// \return std::wstring 描述信息
        virtual const std::wstring GetPromptMessage(CopyActionStatus copyStatus) const = 0;

        /// \brief 复制辅助线确定后的具体复制操作
        ///
        ///  当前复制操作借助辅助线来获取具体的复制位置
        ///  ，当辅助线完成后，会将辅助线的起始位置和
        ///  终点位置通过该接口传入， 以便完成具体的复制操作。
        ///
        /// \param pCurrentView 复制操作所在的视图
        /// \param startPoint 起点位置
        /// \param endPoint 终点位置
        /// \param elementIdsToBeCopied 需要被复制构件ID集合
        virtual void OnLineFinished(IUiView* pCurrentView, const gcmp::Vector3d& startPt, const gcmp::Vector3d& endPt, const std::vector<ElementId>& elementIdsToBeCopied) const = 0;

        /// \brief 获取需要被复制的构件
        ///
        /// \param pCurrentView 复制操作所在的视图
        /// \param selectedElementIds 当前选中的构件集合
        /// \return std::vector<ElementId> 期待被复制的构件ID集合
        virtual std::vector<ElementId> GetElementIdsToBeCopied(IUiView* pCurrentView, const std::vector<ElementId>& selectedElementIds) const = 0;
         
    };
}
